package application;

import java.util.List;

import javax.smartcardio.CardException;

import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import database.bean.AuthCardData;
import database.bean.User;
import database.hibernate.HibernateUtil;

import application.smartcard.InvalidTerminalNumberException;
import application.smartcard.NoTerminalAvailableException;
import application.smartcard.SmartCard;
import application.smartcard.SmartCardManager;
import ihm.AdministrationFrame;


public class LeGroupe4Administration {
        
    
        private static SmartCard smartCard;


	/**
	 * @param args
	 */
	public static void main(String[] args) {		
		// Cette classe sera utilisée pour initialiser/réinitialiser les cartes !
		// C'est le module administration qui va préparer l'application
		// => créer les cartes en BDD, générer les données aléatoires, etc.


		//1) vérifier l'existence d'un lecteur de carte sur le PC, sinon erreur
		try {
			SmartCardManager smartCardManager = new SmartCardManager();
			


			//2) AdministrationFrame
			AdministrationFrame adminFrame = new AdministrationFrame();
			
			//chargement de la BDD pour gagner du temps plus tard !
			Session session = HibernateUtil.getSession();

			while (true) {
				//3) détecter le branchement d'une carte
				adminFrame.updateLabelText(adminFrame.getCardStatusLabel(), AdministrationFrame.STATUS_INSERT_CARD);
				smartCardManager.waitForCard();

				smartCard = smartCardManager.getSmartCard();
				String UID = SmartCard.toHex(smartCard.getUidBytes());
				System.out.println(UID);
				adminFrame.updateLabelText(adminFrame.getCardUidLabel(), UID);
	
				//Session session = HibernateUtil.getSession();
				Transaction tx = session.beginTransaction();
				String bdd_cardUID = null;
	
				//AuthCardData card = (AuthCardData) session.load(AuthCardData.class, UID);
				List<AuthCardData> cardList = session.createCriteria(AuthCardData.class).add(Restrictions.like("card_uid", UID)).list();
				if(!cardList.isEmpty()){
					bdd_cardUID = cardList.get(0).getCard_uid();
					//System.out.println(UID + " et " + bdd_cardUID);
				}
	
				//Cas 1 : UID inconnu => Initialisation
				if(bdd_cardUID == null){
					System.out.println("Initialisation");
					adminFrame.updateLabelText(adminFrame.getCardStatusLabel(), AdministrationFrame.STATUS_UNKNOWN_CARD);
					adminFrame.updateComboBoxEdition(adminFrame.getComboBox(), true);
					adminFrame.updateFieldEdition(adminFrame.getNomField(), true);
					adminFrame.updateFieldEdition(adminFrame.getPrenomField(), true);
					adminFrame.updateFieldEdition(adminFrame.getPasswordField(), true);
					adminFrame.updateFieldEdition(adminFrame.getConfirmPasswordField(), true);
					adminFrame.updateButtonText(adminFrame.INIT_LABEL);
				}
				//Cas 2 : UID connu => Réinitialisation
				else if(UID.equals(bdd_cardUID)){
					System.out.println("Réinitilisation");
					adminFrame.updateLabelText(adminFrame.getCardStatusLabel(), AdministrationFrame.STATUS_KNOWN_CARD);
					adminFrame.updateComboBoxEdition(adminFrame.getComboBox(), true);
					adminFrame.updateFieldEdition(adminFrame.getNomField(), true);
					adminFrame.updateFieldEdition(adminFrame.getPrenomField(), true);
					adminFrame.updateFieldEdition(adminFrame.getPasswordField(), true);
					adminFrame.updateFieldEdition(adminFrame.getConfirmPasswordField(), true);
					adminFrame.updateButtonText(adminFrame.REINIT_LABEL);
	
					//données connues
					User user = ((AuthCardData) session.load(AuthCardData.class, UID)).getUser();
					adminFrame.updateComboBoxValue(adminFrame.getComboBox(), user.getUser_civil());
					adminFrame.updateFieldText(adminFrame.getNomField(), user.getUser_lastname());
					adminFrame.updateFieldText(adminFrame.getPrenomField(), user.getUser_name());
				}
				else{
					System.out.println("Carte reconnue mais différente ? Problème...");
				}
	
				//4) mettre à jour l'adminFrame si débranchement
				smartCardManager.waitForCardWithdrawal();
				adminFrame.updateLabelText(adminFrame.getCardStatusLabel(), AdministrationFrame.STATUS_INSERT_CARD);
				adminFrame.updateLabelText(adminFrame.getCardUidLabel(), "");
				adminFrame.updateComboBoxValue(adminFrame.getComboBox(), null);
				adminFrame.updateFieldText(adminFrame.getNomField(), "");
				adminFrame.updateFieldText(adminFrame.getPrenomField(), "");
				adminFrame.updateFieldText(adminFrame.getPasswordField(), "");
				adminFrame.updateFieldText(adminFrame.getConfirmPasswordField(), "");
				adminFrame.updateComboBoxEdition(adminFrame.getComboBox(), false);
				adminFrame.updateFieldEdition(adminFrame.getNomField(), false);
				adminFrame.updateFieldEdition(adminFrame.getPrenomField(), false);
				adminFrame.updateFieldEdition(adminFrame.getPasswordField(), false);
				adminFrame.updateFieldEdition(adminFrame.getConfirmPasswordField(), false);
				adminFrame.updateButtonText(adminFrame.INIT_LABEL);
				
				tx.commit();
				//session.close();
			}
			
		} catch (NoTerminalAvailableException e) {
			//e.printStackTrace();
			System.out.println("Problème d'accès au terminal lecteur de carte");
		} catch (InvalidTerminalNumberException e) {
			//e.printStackTrace();
			System.out.println("Problème d'accès au terminal lecteur de carte");
		} catch (CardException e) {
			//e.printStackTrace();
			System.out.println("Problème d'accès au terminal lecteur de carte");
		}


	}

    public static SmartCard getSmartCard() {
        return smartCard;
    }

}
